【Android笔记】Activity 的创建过程

Author Avatar
vecrates 12月 30, 2017

概述

Activity 启动过程

 上图为 Activity 在 Android-7.x 下的创建流程,图中所画涉及了两个进程中数个对象间的协作(之前的版本可能没有 ActivityStart 对象)。客户端进程为 Activity 所在的 app 进程,服务端进程为系统进程,客户端进程和服务端进程都通过 Binder 对象和对方通信。创建过程中的比较重要的对象及其职责:

  • Instrumentation:监控应用与系统进程的交互和 Activity 的创建及其生命周期的执行,Activity 的生命周期方法需通过 Instrumentation 来进行调用,并且每个 Activity 中都有 Instrumentation 的引用,一个应用只有一个 Instrumentation。
  • ActivityThread:定义了 main() 函数,应用程序的入口,代表着主线程,负责和 ActiviyManagerService 进行交互,并对 Activity 进行调度等工作。与 Instrumentation 的区别是:ActivityThread 通知 Instrumentation,而 Instrmentation 负责具体的执行。
  • ActivityManagerService:负责 Activity(其实是四大组件)的创建、管理和调度等工作,运行在系统进程中。
  • ActivityRecord:代表一个 Activity,包含有 Activity 的各中信息,存放在 TaskRecord 栈中。
  • TaskRecord:即通常所说的 Activity 任务栈,内维护这一个 ArrayList 管理 ActivityRecord。
  • ActivityStack:维护和管理 Activity 的状态。
  • ActivityStackedSupervisor:内有多ActivityStack(mHomeStack,mFocusedStack,mLastFocusedStack),是比 ActivityStack 高一级的决策者。

上面三者的关系可表示成(图片来源:http://liuwangshu.cn/framework/ams/2-activitytask.html ):

Activity 启动过程

创建流程 

 Activity 的启动从 ContextWrapper(Activity) 的 startActivity() 或者 startActivityForResult() 开始,然后交由 Instrumentation 对象去执行,显示执行 execStartActivities() ,再加上进程的 UserId 调用自身的 execStartActivitiesAsUser()

    public void execStartActivitiesAsUser(Context who, IBinder contextThread,
            IBinder token, Activity target, Intent[] intents, Bundle options,
            int userId) {
            ...
              //这里将调用的是 ActivityManagerProxy.startActivities()
            int result = ActivityManagerNative.getDefault()
                .startActivities(whoThread, who.getBasePackageName(), intents, resolvedTypes,
                token, options, userId);
            ...
     }

    static public IActivityManager getDefault() {
        return gDefault.get();
    }

   private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>()    {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };

    static public IActivityManager asInterface(IBinder obj) {
        if (obj == null) {
            return null;
        }
        IActivityManager in =
            (IActivityManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }
        //返回 ActivityManagerService 在客户端的代理 ActivityManagerProxy
        return new ActivityManagerProxy(obj);
    }

AMS 继承关系

 ActivityManagerNative(AMN)和 AMS 都是 Binder 对象,而 gDefault 是一个单例模式的泛型封装类,类中代码 ServiceManager.getService("activity") 得到的是 AMS 在客户端的代理 ActivityManagerProxy 对象,也就是说创建流程执行到这儿后交给了系统进程的 AMS 对象去执行。

 AMS 收到客户端的请求之后,先后调用自身的 startActivity()startActivityAsUser() 方法,在后一个方法中流程传到了 ActivityStarter 对象当中。

ActivityStart  流程

 ActivityStarter 对象先后调用了 startActivityMayWait()startActivityLocked()startActivityUnchecked() 三个方法,这三个方法做的事大概是:从 Intent 和 其他对象中提取 Activity 的相关信息,然后生成 ActivityRecord 对象和 TaskRecord 对象,最后交给 ActivityStackedSupervisor 对象执行。

Supervisor 和 Stack

 ActivityStackedSupervisor 和 ActivityStack 间有比较繁琐的调用过程,如上图,分别先后调用的方法如下:

  • ActivityStackedSupervisorresumeFocusedStackTopActivityLocked()resumeTopActivityUncheckedLocked()startSpecificActivityLocked()realStartActivityLocked()
  • ActivityStackresumeTopActivityUncheckedLocked()resumeTopActivityInnerLocked()

 总的来说这两者是对 Activity 任务栈 和 Activity 进行了管理,最后调用的方法 realStartActivityLocked() 执行了:

    final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
      ...
      app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,         System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration), new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results, newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
      ...
    }

app.thread 是一个 IApplicationThread 对象,而 IApplicationThread 继承了跨进程通用接口 IInterface,它的实现类是 ApplicationThreadNative,ApplicationThreadNative 还继承了 Binder,可见,当服务端执行结束之后返回给客户端时使用的也是 Binder。继承关系如下:

ApplicationThread 继承关系

 ApplicationThread 继承了 ApplicationThreadNative,ApplicationThread 是 ActivityThread 中的一个内部类,所以说最终的调用流程是回到了 ActivityThread 对象中:

   public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
                ...
                sendMessage(H.LAUNCH_ACTIVITY, r);
                ...           
     }
    ...
    public void handleMessage(Message msg) {
      if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
      switch (msg.what) {
        case LAUNCH_ACTIVITY: {
          Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
          final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

          r.packageInfo = getPackageInfoNoCheck(
            r.activityInfo.applicationInfo, r.compatInfo);
          handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
          Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        } break;
        case RELAUNCH_ACTIVITY: {
          Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
          ActivityClientRecord r = (ActivityClientRecord)msg.obj;
          handleRelaunchActivity(r);
          Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        } break;
        case PAUSE_ACTIVITY: {
          Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                    SomeArgs args = (SomeArgs) msg.obj;
                    handlePauseActivity((IBinder) args.arg1, false,
                            (args.argi1 & USER_LEAVING) != 0, args.argi2,
                            (args.argi1 & DONT_REPORT) != 0, args.argi3);
                    maybeSnapshot();
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
          ...
          //后面还有很多 case
      }

 切换到客户端进程以后,在 ApplicationThread 的 scheduleLaunchActivity() 中先是把服务端返回的信息封装成 ActivityClientRecord,由于是运行在 Binder 线程池中的线程,所以使用了 Handler 切换到主线程去执行,然后在主线程中:

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
        Activity a = performLaunchActivity(r, customIntent);
    }

  执行了 ActivityThread 的 performLaunchActivity(),完成 Activity 的创建。

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ...
      //1 创建 Activity 对象
     activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent);
     //2 创建 Application 对象
    Application app = r.packageInfo.makeApplication(false, mInstrumentation);
                  activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window);
  //3 创建上下文, Window 等
  Context appContext = createBaseContextForActivity(r, activity);
  activity.attach(appContext, this, getInstrumentation(), r.token,
                  r.ident, app, r.intent, r.activityInfo, title, r.parent,
                  r.embeddedID, r.lastNonConfigurationInstances, config,
                  r.referrer, r.voiceInteractor, window);
  //4 调用 Actvity 对象的 onCreate()
  if (r.isPersistable()) {
     mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
   } else {
     mInstrumentation.callActivityOnCreate(activity, r.state);
   }
}

//这是 Instrumentation 的方法,通过此方法创建 Activity
public Activity newActivity(ClassLoader cl, String className,
                            Intent intent)
  throws InstantiationException, IllegalAccessException,
  ClassNotFoundException {
  return (Activity)cl.loadClass(className).newInstance();
}

Activity 启动过程

++

【凯子哥带你学Framework】Activity启动过程全解析

探索7.x, 全面解析Activity启动框架 (1)